package com.wangdong.mijiqiqi.notification;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.wangdong.mijiqiqi.R;

public class HomeActivity extends AppCompatActivity {

    private NotificationManager mNotificationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }

    //显示通知
    public void sendNotifcat(View view) {

        //点击跳转:
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"));
        //可以getActivity()，getBroadcast()，getService() 等静态方法来获取。
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);


        //渠道"chat"在MainActivity创建过一次就可以了
        Notification notification = new NotificationCompat.Builder(this, "chat")
                //必须设置的
                .setContentTitle("冬去春来")
                .setContentText("春去秋来")
                .setSmallIcon(R.mipmap.ic_launcher)
                //其他设置
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_background))
                .setWhen(System.currentTimeMillis())  //显示时间,毫米为单位
                .setAutoCancel(true)//true :点击后自动消失,false 点击后不消失
                .setContentIntent(pi)//添加意图点击跳转
                .setDefaults(NotificationCompat.DEFAULT_ALL)//设置铃声及震动效果等
                // 也可对铃声，LED灯，震动等分别进行设置
                //.setSound()//铃声
                //. setLights()//LED灯
                //. setVibrate()//震动
                .build();
        mNotificationManager.notify(12, notification);

    }

    //代码移除通知
    public void cancelNotifcat(View view) {
        mNotificationManager.cancel(12);//移除指定id的通知
        // mNotificationManager.cancelAll();//取消所有通知
    }

    //标准显示通知
    public void ceshibiaozunnotifi(View view) {
        Bitmap btm = BitmapFactory.decodeResource(getResources(),
                R.mipmap.ic_launcher);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                HomeActivity.this,"chat")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("5 new message")
                .setContentText("twain@android.com");

        mBuilder.setTicker("New message");//第一次提示消息的时候显示在通知栏上
        mBuilder.setNumber(12);
        mBuilder.setLargeIcon(btm);
        mBuilder.setAutoCancel(true);//自己维护通知的消失

        //构建一个Intent
        Intent resultIntent = new Intent(HomeActivity.this,
                MainActivity.class);
        //封装一个Intent
        PendingIntent resultPendingIntent = PendingIntent.getActivity(
                HomeActivity.this, 0, resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        // 设置通知主题的意图
        mBuilder.setContentIntent(resultPendingIntent);
        //获取通知管理器对象
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());
    }
    //大视图显示通知
    public void ceshidashituotifi(View view) {
        Bitmap btm = BitmapFactory.decodeResource(getResources(),
                                         R.mipmap.ic_launcher);
                         Intent intent = new Intent(HomeActivity.this,
                                       MainActivity.class);

                        PendingIntent pendingIntent = PendingIntent.getActivity(
                                HomeActivity.this, 0, intent,
                                         PendingIntent.FLAG_CANCEL_CURRENT);

                         Notification noti = new NotificationCompat.Builder(
                                        HomeActivity.this,"chat")
                                 .setSmallIcon(R.mipmap.ic_launcher)
                                 .setLargeIcon(btm)
                                .setNumber(13)
                                 .setContentIntent(pendingIntent)
                                .setStyle(
                                                new NotificationCompat.InboxStyle()
                                                 .addLine(
                                                                 "M.Twain (Google+) Haiku is more than a cert...")
                                                 .addLine("M.Twain Reminder")
                                                 .addLine("M.Twain Lunch?")
                                                 .addLine("M.Twain Revised Specs")
                                                 .addLine("M.Twain ")
                                                 .addLine(
                                                                 "Google Play Celebrate 25 billion apps with Goo..")
                                                .addLine(
                                                                 "Stack Exchange StackOverflow weekly Newsl...")
                                                 .setBigContentTitle("6 new message")
                                                 .setSummaryText("mtwain@android.com"))
                                 .build();

                         NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                        mNotificationManager.notify(3, noti);
    }

    //进度条显示通知
    /*　对于一个标准通知，有时候显示的消息并不一定是静态的，还可以设定一个进度条用于显示事务完成的进度。

　　Notification.Builder类中提供一个setProgress(int max,int progress,boolean indeterminate)方法用于设置进度条
，max用于设定进度的最大数，progress用于设定当前的进度，indeterminate用于设定是否是一个确定进度的进度条。通过indeterminate的设置，
可以实现两种不同样式的进度条，一种是有进度刻度的（true）,一种是循环流动的（false）。下面分别用两个示例演示：

　　有进度的进度条，实现代码： */
    public void ceshiprogrenotifi(View view) {

       final NotificationCompat.Builder notificat = new NotificationCompat.Builder(HomeActivity.this,"chat")
               .setSmallIcon(R.mipmap.ic_launcher)
               .setContentTitle("Picture Download")
               .setContentText("Download in progress");
        notificat.setAutoCancel(true);

        //通过一个子线程，动态增加进度条刻度
               new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int incr;
                        for (incr = 0; incr <= 100; incr += 5) {
                            notificat.setProgress(100,incr,false);
                            mNotificationManager.notify(5, notificat.build());
                            try {
                                Thread.sleep(300);
                            } catch (InterruptedException e) {
                                Log.i("wangdong", "sleep failure");
                            }
                        }
                        notificat.setContentText("Download complete")
                                .setProgress(0, 0, false);
                        mNotificationManager.notify(0, notificat.build());
                                     }
                 }).start();
    }
//循环进度条
    public void ceshixunhuanprogrenotifi(View view) {

        final NotificationCompat.Builder    builder = new NotificationCompat.Builder(HomeActivity.this,"chat")
                                .setSmallIcon(R.mipmap.ic_launcher)
                                 .setContentTitle("Picture Download")
                                 .setContentText("Download in progress");
                         builder.setProgress(0, 0, true);//设置为true，表示流动
        mNotificationManager.notify(0, builder.build());

                         //5秒之后还停止流动
                         new Thread(new Runnable() {
                     @Override
                     public void run() {
                                         try {
                                                 Thread.sleep(5000);
                                             } catch (InterruptedException e) {
                                                e.printStackTrace();
                                             }
                                         builder.setProgress(100, 100, false);//设置为true，表示刻度
                         mNotificationManager.notify(0, builder.build());
                                     }
                 }).start();
    }

    /*自定义通知

　　和Toast一样，通知也可以使用自定义的XML来自定义样式，但是对于通知而言，因为它的全局性，并不能简单的通过inflate膨胀出一个View，因为可能触发通知的时候，响应的App已经关闭，无法获取当指定的XML布局文件。所以需要使用单独的一个RemoteViews类来操作。

　　RemoteViews，描述了一个视图层次的结构，可以显示在另一个进程。层次结构也是从布局文件中“膨胀”出一个视图，这个类，提供了一些基本的操作求改其膨胀的内容。

　　RemoteViews提供了多个构造函数，一般使用RemoteViews(String packageName,int layoutId)。第一个参数为包的名称，第二个为layout资源的Id。当获取到RemoteViews对象之后，可以使用它的一系列setXxx()方法通过控件的Id设置控件的属性。最后使用NotificationCompat.Builder.setContent(RemoteViews)方法设置它到一个Notification中。

　　下面通过一个示例展示它：

　　自定义的布局XML代码：

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:padding="10dp" >
 6
 7     <ImageView
 8         android:id="@+id/imageNo"
 9         android:layout_width="wrap_content"
10         android:layout_height="match_parent"
11         android:layout_alignParentLeft="true"
12         android:layout_marginRight="10dp" />
13
14     <TextView
15         android:id="@+id/titleNo"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_toRightOf="@id/imageNo" />
19
20     <TextView
21         android:id="@+id/textNo"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:layout_below="@id/titleNo"
25         android:layout_toRightOf="@id/imageNo" />
26
27 </RelativeLayout>
复制代码
　　实现代码：

复制代码
 1         btnCustomNotification.setOnClickListener(new View.OnClickListener() {
 2             @Override
 3             public void onClick(View v) {
 4                 RemoteViews contentViews = new RemoteViews(getPackageName(),
 5                         R.layout.custom_notification);
 6                 //通过控件的Id设置属性
 7                 contentViews
 8                         .setImageViewResource(R.id.imageNo, R.drawable.btm1);
 9                 contentViews.setTextViewText(R.id.titleNo, "自定义通知标题");
10                 contentViews.setTextViewText(R.id.textNo, "自定义通知内容");
11
12                 Intent intent = new Intent(MainActivity.this,
13                         ResultActivity.class);
14
15                 PendingIntent pendingIntent = PendingIntent.getActivity(
16                         MainActivity.this, 0, intent,
17                         PendingIntent.FLAG_CANCEL_CURRENT);
18                 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
19                         MainActivity.this).setSmallIcon(R.drawable.ic_launcher)
20                         .setContentTitle("My notification")
21                         .setTicker("new message");
22                 mBuilder.setAutoCancel(true);
23
24                 mBuilder.setContentIntent(pendingIntent);
25                 mBuilder.setContent(contentViews);
26                 mBuilder.setAutoCancel(true);
27                 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
28                 mNotificationManager.notify(10, mBuilder.build());
29             }
30         });
复制代码
　　效果展示：





设定提示响应

　　对于有些通知，需要调用一些设备的资源，使用户能更快的发现有新通知，一般可设定的响应有：铃声、闪光灯、震动。对于这三个属性，NotificationCompat.Builder提供了三个方法设定：

setSound(Uri sound)：设定一个铃声，用于在通知的时候响应。传递一个Uri的参数，格式为“file:///mnt/sdcard/Xxx.mp3”。
setLights(int argb, int onMs, int offMs)：设定前置LED灯的闪烁速率，持续毫秒数，停顿毫秒数。
setVibrate(long[] pattern)：设定震动的模式，以一个long数组保存毫秒级间隔的震动。
　　大多数时候，我们并不需要设定一个特定的响应效果，只需要遵照用户设备上系统通知的效果即可，那么可以使用setDefaults(int)方法设定默认响应参数，在Notification中，对它的参数使用常量定义了，我们只需使用即可：

DEFAULT_ALL：铃声、闪光、震动均系统默认。
DEFAULT_SOUND：系统默认铃声。
DEFAULT_VIBRATE：系统默认震动。
DEFAULT_LIGHTS：系统默认闪光。
　　而在Android中，如果需要访问硬件设备的话，是需要对其进行授权的，所以需要在清单文件AndroidManifest.xml中增加两个授权，分别授予访问振动器与闪光灯的权限：

1     <!-- 闪光灯权限 -->
2     <uses-permission android:name="android.permission.FLASHLIGHT"/>
3     <!-- 振动器权限 -->
4     <uses-permission android:name="android.permission.VIBRATE"/>


　　因为只是一个属性的设定，并且大部分时候，使用系统设定即可，这里就不提供代码示例了。

　　源码下载

总结

　　通知算是Android中比较常用的一个功能，可以保持自己App的长存，在用户没有进入App的时候，也提供了与用户交互的可能。*/
}
